const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const connectDB = require('./config/db');

const app = express();

// 连接数据库
connectDB();

// 基础中间件
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// ==================== 新增请求/响应日志中间件 ====================
// 请求日志（记录接口路径、传参）
app.use((req, res, next) => {
  console.log('\n【接口调用开始】');
  console.log('接口路径:', req.originalUrl);
  console.log('请求方法:', req.method);
  console.log('查询参数:', req.query);       // GET 请求参数
  console.log('请求体:', req.body);         // POST/PUT 等请求体
  next();
});

// 响应日志（记录返回内容）
app.use((req, res, next) => {
  // 保存原始的 res.json 方法
  const originalJson = res.json;
  // 重写 res.json 以捕获返回数据
  res.json = function (data) {
    console.log('【接口返回信息】');
    console.log('状态码:', res.statusCode);  // HTTP 状态码
    console.log('返回内容:', data);          // 接口实际返回的数据
    originalJson.call(this, data);          // 调用原始方法完成响应
  };
  next();
});
// ==================== 新增结束 ====================

// 基础路由
app.get('/', (req, res) => {
  res.send('积分商城后端服务已启动');
});

// 挂载路由
app.use('/api/users', require('./routes/users'));
app.use('/api/products', require('./routes/products'));  // 假设已挂载商品路由
app.use('/api/orders', require('./routes/orders'));      // 假设已挂载订单路由

// 404 处理中间件
app.use((req, res, next) => {
  const err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// 错误处理中间件（返回 JSON）
app.use((err, req, res, next) => {
  const statusCode = err.status || 500;
  const errorResponse = {
    success: false,
    message: err.message,
    ...(process.env.NODE_ENV === 'development' && { error: err.stack })
  };
  res.status(statusCode).json(errorResponse);
});

// 移除冗余的视图错误处理
module.exports = app;

// const PORT = process.env.PORT || 3008;
// app.listen(PORT, () => {
//   console.log(`服务器运行在 http://localhost:${PORT}`);
// });

// catch 404 and forward to error handler
// 移除原404处理（原代码中可能引入了未定义的 createError）
// 替换为明确的404错误创建
app.use((req, res, next) => {
  const err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// 错误处理中间件（修改为返回JSON）
app.use((err, req, res, next) => {
  const statusCode = err.status || 500;
  // 开发环境返回详细错误栈，生产环境仅返回消息
  const errorResponse = {
    success: false,
    message: err.message,
    ...(process.env.NODE_ENV === 'development' && { error: err.stack })
  };
  res.status(statusCode).json(errorResponse);
});

// 移除原视图渲染的错误处理（原res.render('error')会导致找不到视图文件）
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
